/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.tp2.etna.exportacion.dao;

import com.tp2.etna.distribucion2.constante.ConstanteDist2;
import com.tp2.etna.distribucion2.modelo.Entrega;
import com.tp2.etna.exportacion.modelo.ClienteModel;
import com.tp2.etna.exportacion.modelo.DetalleDocumentoExportacionModel;
import com.tp2.etna.exportacion.modelo.DocumentoExportacionModel;
import com.tp2.etna.exportacion.modelo.PaisModel;
import com.tp2.etna.exportacion.modelo.RequerimientoModel;
import com.tp2.etna.exportacion.modelo.SolicitudAtencionModel;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository
public class SolicitudAtencionDAOImpl implements
        SolicitudAtencionDAO {

    @Autowired
    private DataSource dataSource;

    public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    @Override
    public List<SolicitudAtencionModel> consultaSolicitud(String Cliente, Date FechaDesde, Date FechaHasta) {
        System.out.println("Ingreso");
        System.out.println(Cliente);
        System.out.println(FechaDesde);
        System.out.println(FechaHasta);
        System.out.println("Listo");
        List<SolicitudAtencionModel> solicitudes = new ArrayList<SolicitudAtencionModel>();
        String query = "select a.Codigo, a.CodigoRequerimiento, c.RazonSocial, a.Responsable, a.FechaRegistro, a.FechaReservaEspacio, "
                + " a.Estado, a.Observaciones "
                + " From SolicitudAtencion a inner join Requerimiento b "
                + " on a.codigorequerimiento = b.codigo inner join Cliente c "
                + " on b.codigoCliente = c.codigo "
                + " Where c.RazonSocial like '%" + Cliente + "%' ";

        if (FechaDesde != null && FechaHasta != null) {
            query = query + " and a.FechaRegistro between ? and ?;";
        }
        System.out.println(query);

        Connection con = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            con = dataSource.getConnection();
            ps = con.prepareStatement(query);
            if (FechaDesde != null && FechaHasta != null) {
                ps.setDate(1, (java.sql.Date) FechaDesde);
                ps.setDate(2, (java.sql.Date) FechaHasta);
            }
            rs = ps.executeQuery();
            while (rs.next()) {
                SolicitudAtencionModel itm = new SolicitudAtencionModel();
                itm.setCodigo(rs.getInt("Codigo"));
                itm.setCodigoRequerimiento(rs.getInt("CodigoRequerimiento"));
                itm.setResponsable(rs.getString("Responsable"));
                itm.setFechaRegistro(rs.getString("FechaRegistro"));
                itm.setFechaReservaEspacio(rs.getString("FechaReservaEspacio"));
                itm.setEstado(rs.getString("Estado"));
                itm.setObservaciones(rs.getString("Observaciones"));

                ClienteModel cliente = new ClienteModel();
                cliente.setRazonSocial(rs.getString("RazonSocial"));
                itm.setCliente(cliente);

                solicitudes.add(itm);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                rs.close();
                ps.close();
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return solicitudes;
    }

    @Override
    public Boolean AgregarSolicitud(SolicitudAtencionModel solicitudAtencion) {
        String query = "insert into solicitudatencion (codigo, codigorequerimiento, responsable, "
                + " fecharegistro, fechareservaespacio, fechadespacho, estado, observaciones)"
                + " values (?,?,?,SYSDATE(),SYSDATE(),SYSDATE(),?,?);";

        Connection con = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            con = dataSource.getConnection();

            String querymaximo = "select ifnull(max(codigo),0)+1 as codigo from SolicitudAtencion;";
            ps = con.prepareStatement(querymaximo);
            rs = ps.executeQuery();
            if (rs.next()) {
                solicitudAtencion.setCodigo(rs.getInt("codigo"));
            }

            ps = con.prepareStatement(query);
            ps.setInt(1, solicitudAtencion.getCodigo());
            ps.setInt(2, solicitudAtencion.getCodigoRequerimiento());
            ps.setString(3, solicitudAtencion.getResponsable());
            ps.setString(4, solicitudAtencion.getEstado());
            ps.setString(5, solicitudAtencion.getObservaciones());
            int out = ps.executeUpdate();
            if (out != 0) {
                if (solicitudAtencion.getDocumentoExportacion() != null) {
                    System.out.println("Cantidad Exportaciones " + solicitudAtencion.getDocumentoExportacion().size());
                    //Guardar DocumentoExportacion y Detalles
                    for (DocumentoExportacionModel itmdoc : solicitudAtencion.getDocumentoExportacion()) {
                        querymaximo = "select ifnull(max(codigo),0)+1 as codigo from DocumentoExportacion;";
                        query = " insert into DocumentoExportacion (codigo, descripcion, fecharegistro, CodigoRequerimientoDet) "
                                + " values (?,'',SYSDATE(),?);";
                        ps = con.prepareStatement(querymaximo);
                        rs = ps.executeQuery();
                        if (rs.next()) {
                            itmdoc.setCodigo(rs.getInt("codigo"));
                        }

                        ps = con.prepareStatement(query);
                        ps.setInt(1, itmdoc.getCodigo());
                        ps.setInt(2, itmdoc.getCodigoRequerimientoDet());
                        out = ps.executeUpdate();
                        if (out != 0) {
                            //Detalle documento exportacion
                            for (DetalleDocumentoExportacionModel itmdetdoc : itmdoc.getDetalleDocumentoExportacion()) {
                                System.out.println("Detalle doc exportacion: " + itmdoc.getCodigoRequerimientoDet() + "," + itmdoc.getDetalleDocumentoExportacion().size());
                                querymaximo = "select ifnull(max(codigo),0)+1 as codigo from DetalleDocumentoExportacion;";
                                query = " insert into DetalleDocumentoExportacion (CodigoDocumentoSICEX, CodigoDocumentoExportacion, Codigo, FlagAprobado) "
                                        + " values (?,?,?,0)";
                                ps = con.prepareStatement(querymaximo);
                                rs = ps.executeQuery();
                                if (rs.next()) {
                                    itmdetdoc.setCodigo(rs.getInt("codigo"));
                                }

                                ps = con.prepareStatement(query);
                                ps.setInt(1, itmdetdoc.getCodigoDocumentoSicex());
                                ps.setInt(2, itmdoc.getCodigo());
                                ps.setInt(3, itmdetdoc.getCodigo());
                                out = ps.executeUpdate();
                            }

                        }
                    }
                }
                return true;
            }

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                ps.close();
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return false;

    }

    @Override
    public Boolean ActualizarSolicitud(SolicitudAtencionModel solicitudAtencion) {
        String query = "update solicitudatencion set responsable = ?, observaciones=? "
                + " where codigo=?;";

        Connection con = null;
        PreparedStatement ps = null;
        try {
            con = dataSource.getConnection();

            ps = con.prepareStatement(query);
            ps.setString(1, solicitudAtencion.getResponsable());
            ps.setString(2, solicitudAtencion.getObservaciones());
            ps.setInt(3, solicitudAtencion.getCodigo());

            int out = ps.executeUpdate();
            if (out != 0) {
                return true;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                ps.close();
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return false;
    }

    @Override
    public SolicitudAtencionModel SolicitudById(Integer codigo) {
        SolicitudAtencionModel solicitud = new SolicitudAtencionModel();
        String query = "Select Codigo, CodigoRequerimiento, Responsable, "
                + " Fecharegistro, FechaReservaEspacio, fechaDespacho, "
                + " Estado, Observaciones "
                + " From SolicitudAtencion "
                + " where Codigo = ? ";

        Connection con = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            con = dataSource.getConnection();
            ps = con.prepareStatement(query);
            ps.setInt(1, codigo);
            rs = ps.executeQuery();
            while (rs.next()) {
                solicitud.setCodigo(rs.getInt("Codigo"));
                solicitud.setCodigoRequerimiento(rs.getInt("CodigoRequerimiento"));
                solicitud.setResponsable(rs.getString("Responsable"));
                solicitud.setFechaRegistro(rs.getString("FechaRegistro"));
                solicitud.setFechaReservaEspacio(rs.getString("FechaReservaEspacio"));
                solicitud.setFechaDespacho(rs.getString("FechaDespacho"));
                solicitud.setEstado(rs.getString("Estado"));
                solicitud.setObservaciones(rs.getString("Observaciones"));
                System.out.println("Observaciones: " + rs.getString("Observaciones"));
                break;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                rs.close();
                ps.close();
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return solicitud;
    }

    @Override
    public Boolean ActualizarEstadoSolicitud(Integer codigo, String Estado) {
        String query = "update solicitudatencion set estado = '" + Estado + "' "
                + " where codigo=?;";

        Connection con = null;
        PreparedStatement ps = null;
        try {
            con = dataSource.getConnection();

            ps = con.prepareStatement(query);
            ps.setInt(1, codigo);

            int out = ps.executeUpdate();
            if (out != 0) {
                return true;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                ps.close();
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return false;
    }

    @Override
    public List<SolicitudAtencionModel> consultaAprobarSolicitud(String Estado, Date FechaDesde, Date FechaHasta) {
        List<SolicitudAtencionModel> solicitudes = new ArrayList<SolicitudAtencionModel>();
        String query = "select 	a.Codigo, a.CodigoRequerimiento, a.FechaRegistro, d.RazonSocial, a.FechaReservaEspacio, a.FechaDespacho, "
                + " a.Responsable, sum(c.Cantidad) as cantidad, a.Estado, a.Observaciones "
                + " from solicitudatencion a inner join requerimiento b "
                + " on a.CodigoRequerimiento = b.Codigo inner join detallerequerimiento c "
                + " on b.Codigo = c.CodigoRequerimiento inner join cliente d "
                + " on b.CodigoCliente = d.Codigo "
                + " where a.Estado like '%" + Estado + "%' "
                + " group by a.Codigo, d.RazonSocial, a.FechaReservaEspacio, a.FechaDespacho, "
                + " a.Responsable, a.Estado ";
        if (FechaDesde != null && FechaHasta != null) {
            query = query + " and a.FechaRegistro between ? and ?;";
        }

        Connection con = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            con = dataSource.getConnection();
            ps = con.prepareStatement(query);
            if (FechaDesde != null && FechaHasta != null) {
                ps.setDate(1, (java.sql.Date) FechaDesde);
                ps.setDate(2, (java.sql.Date) FechaHasta);
            }
            rs = ps.executeQuery();
            while (rs.next()) {
                SolicitudAtencionModel itm = new SolicitudAtencionModel();
                itm.setCodigo(rs.getInt("Codigo"));
                itm.setCodigoRequerimiento(rs.getInt("CodigoRequerimiento"));
                itm.setResponsable(rs.getString("Responsable"));
                itm.setFechaRegistro(rs.getString("FechaRegistro"));
                itm.setFechaReservaEspacio(rs.getString("FechaReservaEspacio"));
                itm.setFechaDespacho(rs.getString("FechaDespacho"));
                itm.setCantidad(rs.getInt("Cantidad"));
                itm.setEstado(rs.getString("Estado"));
                itm.setObservaciones(rs.getString("Observaciones"));
                ClienteModel cliente = new ClienteModel();
                cliente.setRazonSocial(rs.getString("RazonSocial"));
                itm.setCliente(cliente);

                solicitudes.add(itm);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                rs.close();
                ps.close();
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return solicitudes;
    }

}
